/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package br.gov.cemaden.library.dao.smp;

import br.gov.cemaden.library.dao.GenericDao;
import br.gov.cemaden.library.interfaces.smp.LogProdutoInterface;
import br.gov.cemaden.library.model.produto.Produto;
import br.gov.cemaden.library.model.smp.LogProduto;
import java.math.BigInteger;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

/**
 *
 * @author alan
 */
public class LogProdutoDao extends GenericDao implements LogProdutoInterface{
    
    Session session;
    
    public LogProdutoDao(Session session){
        this.session = session;
    }

    public List<LogProduto> findAll() {
        List<LogProduto> list = null;
        try{
            Query query = session.getNamedQuery("LogProduto.findAll");
            list = query.list();
        }
        catch(HibernateException ex){
            throw ex;
        }
        return list;
    }
    
    public List<LogProduto> findByProduto(Produto produto) {
        List<LogProduto> list = null;
        try{
            Query query = session.getNamedQuery("LogProduto.findByProduto").setParameter("produto", produto);
            list = query.list();
        }
        catch(HibernateException ex){
            throw ex;
        }        
        return list;
    }
    
     //metodo para saber o total de linhas registrada na tabela
    public BigInteger totalCadastro() {
        BigInteger total = null;
        try {
            //Session session = HibernateUtil.getSessionFactory().getCurrentSession();
            Transaction tx = session.beginTransaction();
            String hql = "SELECT COUNT(*) as total FROM smp.smp_log_produto";
            Query query = session.createSQLQuery(hql);
            total = (BigInteger) query.uniqueResult();
            session.flush();
            tx.commit();

        } catch (HibernateException e) {
            System.out.println("Erro no LogProdutoDao.totalCadastro() - " + e.toString());
            throw new HibernateException(e);
        }
        return total;
    }
    
    public List<LogProduto> findByBetween(float inicio, float fim, Long id) {
        List<LogProduto> list = null;
        try {
            //Session session = HibernateUtil.getSessionFactory().getCurrentSession();
            Transaction tx = session.beginTransaction();
            String hql;
            if (id == null) {
                hql = "SELECT * FROM smp.smp_log_produto ORDER BY id_log_produto ASC LIMIT " + inicio + " OFFSET " + fim;
            } else {
                hql = "SELECT * FROM smp.smp_log_produto WHERE id_log_produto = " + id;
            }

            list = session.createSQLQuery(hql).addEntity(LogProduto.class).list();
            session.flush();
            tx.commit();
        } catch (HibernateException e) {
            System.out.println("Erro no LogProdutoDao.findByBetween() - " + e.toString());
            throw new HibernateException(e);
        }
        return list;
    }
    

    public void insert(LogProduto log){
        
        try{
            saveOrUpdate(session, log);
        }catch(Exception ex){
            throw new HibernateException(ex);
        }
    }
    
}
